>  기사  >  백엔드 개발  >  http - PHP CURL이 백엔드 API(POST)를 요청할 때 요청 본문에 여러 경계가 있도록 요청 데이터를 구성하는 방법은 무엇입니까?

http - PHP CURL이 백엔드 API(POST)를 요청할 때 요청 본문에 여러 경계가 있도록 요청 데이터를 구성하는 방법은 무엇입니까?

WBOY
WBOY원래의
2016-08-04 09:19:472029검색

백엔드 API 요청 시 백엔드에서 받는 데이터 형식은 다음과 같습니다.

<code class="bash">请求方法: post

请求body:

//part1,content-type:application/json
{
    "description": "desdes"
}

//part2,content-type: octet-stream
{
    "product_img": octet-stream file, 
    "config_img ": octet-stream file, 
    "dopm": octet-stream file 

}
</code>

API에서 요구하는 데이터 중 php curl포스트 데이터 전송 시 구성된 포스트 요청 본문에는 content-type

두 개가 있어야 합니다.

하나는 일반 데이터Content-Type: application/json

한 가지 요구 사항은 content-type: octet-stream, 바이너리 스트림, 주로 사진 및 기타 형식의 파일을 스트림 형식으로 변환하고 API로 전송하여 저장합니다

우리는 보통 curl_setopt($curl, CURLOPT_POSTFIELDS, $body);을 사용하여 요청 본문을 설정하는데, 이 형식으로 요청 본문을 구성하는 방법은

<code class="php">
$header = NULL;
$body = [];

$curl = curl_init();
curl_setopt($curl, CURLOPT_URL, $url);
curl_setopt($curl, CURLOPT_POST, true);
curl_setopt($curl, CURLOPT_POSTFIELDS, $body);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($curl, CURLOPT_CUSTOMREQUEST, 'POST');
if(!is_null($header)){
    curl_setopt($curl, CURLOPT_HTTPHEADER, $header);
}
curl_setopt($curl, CURLOPT_CONNECTTIMEOUT, 10);
curl_setopt($curl, CURLOPT_FOLLOWLOCATION, true); 
curl_setopt($curl, CURLOPT_TIMEOUT, 10);
$curl_get = curl_exec($curl);
</code>

답글 내용:

백엔드 API 요청 시 백엔드에서 받는 데이터 형식은 다음과 같습니다.

<code class="bash">请求方法: post

请求body:

//part1,content-type:application/json
{
    "description": "desdes"
}

//part2,content-type: octet-stream
{
    "product_img": octet-stream file, 
    "config_img ": octet-stream file, 
    "dopm": octet-stream file 

}
</code>

API에서 요구하는 데이터 중 php curl포스트 데이터 전송 시 구성된 포스트 요청 본문에는 content-type

두 개가 있어야 합니다.

하나는 일반 데이터Content-Type: application/json

한 가지 요구 사항은 content-type: octet-stream, 바이너리 스트림, 주로 사진 및 기타 형식의 파일을 스트림 형식으로 변환하고 API로 전송하여 저장합니다

우리는 보통 curl_setopt($curl, CURLOPT_POSTFIELDS, $body);을 사용하여 요청 본문을 설정하는데, 이 형식으로 요청 본문을 구성하는 방법은

<code class="php">
$header = NULL;
$body = [];

$curl = curl_init();
curl_setopt($curl, CURLOPT_URL, $url);
curl_setopt($curl, CURLOPT_POST, true);
curl_setopt($curl, CURLOPT_POSTFIELDS, $body);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($curl, CURLOPT_CUSTOMREQUEST, 'POST');
if(!is_null($header)){
    curl_setopt($curl, CURLOPT_HTTPHEADER, $header);
}
curl_setopt($curl, CURLOPT_CONNECTTIMEOUT, 10);
curl_setopt($curl, CURLOPT_FOLLOWLOCATION, true); 
curl_setopt($curl, CURLOPT_TIMEOUT, 10);
$curl_get = curl_exec($curl);
</code>

파일을 스트림 형식으로 변환하는 데 CURLFile을 사용하는 것은 사실입니다. 그런데 위 내용을 처리할 때 요청 시간 초과가 너무 짧아서 데이터 스트림 전에 tcp 링크가 끊어졌습니다.

보냈습니다.

API에 일반 CURL 요청을 할 때는 시간 초과를 10초로 설정하는 것이 좋습니다. 파일 업로드 시간이 너무 오래 걸릴 경우 링크 시간과 제한 시간을 늘리세요

CURLOPT_FOLLOWLOCATION , CURLOPT_TIMEOUT

<code>$header = NULL;
$body = [
    'img' => new CURLFile('imagepath', 'octet-stream', 'file_name')
];

$curl = curl_init();
curl_setopt($curl, CURLOPT_URL, $url);
curl_setopt($curl, CURLOPT_POST, true);
curl_setopt($curl, CURLOPT_POSTFIELDS, $body);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($curl, CURLOPT_CUSTOMREQUEST, 'POST');
if(!is_null($header)){
    curl_setopt($curl, CURLOPT_HTTPHEADER, $header);
}

//设置链接超时时间为1分钟
curl_setopt($curl, CURLOPT_CONNECTTIMEOUT, 60);
curl_setopt($curl, CURLOPT_FOLLOWLOCATION, true); 
curl_setopt($curl, CURLOPT_TIMEOUT, 60);
$curl_get = curl_exec($curl);
</code>

-콘텐츠 유형: 애플리케이션/json: json_encode
-콘텐츠 유형: 옥텟-스트림:
php>5.6

<code>$file_data = array('image' => new \CURLFile(realpath($source)));</code>

php

<code>$file_data = array('image'=> '@' . realpath($source));//<=5.5</code>
성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.