content-type application/json 请求 服务端怎么获取请求数据
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了content-type application/json 请求 服务端怎么获取请求数据相关的知识,希望对你有一定的参考价值。
content-type application/json 请求 服务端怎么获取请求数据在android/java平台上实现POST一个json数据:
JSONObject jsonObj = new JSONObject();
jsonObj.put("username", username);
jsonObj.put("apikey", apikey);
// Create the POST object and add the parameters
HttpPost httpPost = new HttpPost(url);
StringEntity entity = new StringEntity(jsonObj.toString(), HTTP.UTF_8);
entity.setContentType("application/json");
httpPost.setEntity(entity);
HttpClient client = new DefaultHttpClient();
HttpResponse response = client.execute(httpPost);
用curl可执行如下命令:
curl -l -H "Content-type: application/json" -X POST -d '"phone":"13521389587","password":"test"' http://domain/apis/users.json
用jQuery:
$.ajax(
url:url,
type:"POST",
data:data,
contentType:"application/json; charset=utf-8",
dataType:"json",
success: function()
...
) 参考技术A
在Android/java平台上实现POST一个json数据:
JSONObject jsonObj = new JSONObject();
jsonObj.put("username", username);
jsonObj.put("apikey", apikey);
// Create the POST object and add the parameters
HttpPost httpPost = new HttpPost(url);
StringEntity entity = new StringEntity(jsonObj.toString(), HTTP.UTF_8);
entity.setContentType("application/json");
httpPost.setEntity(entity);
HttpClient client = new DefaultHttpClient();
HttpResponse response = client.execute(httpPost);
用curl可执行如下命令:
curl -l -H "Content-type: application/json" -X POST -d '"phone":"13521389587","password":"test"' http://domain/apis/users.json
用jQuery:
$.ajax(
url:url,
type:"POST",
data:data,
contentType:"application/json; charset=utf-8",
dataType:"json",
success: function()
...
)
服务端(Server)是为客户端服务的,服务的内容诸如向客户端提供资源,保存客户端数据。一般大型的服务端都是在linux环境下搭建。
服务端不具备运算能力,因为服务端同时会与多个客户端建立连接,一旦服务端进行运算的话,就会占用大量的资源,从而影响到其他客户端的通信。
服务端是一种有针对性的服务程序。它的主要表现形式以“windows窗口程序”与“控制台”为主。一般大型的服务端都是在linux环境下搭建。运行服务端的电脑称之为“服务器”。
Slim - 如何发送带有“Content-Type:application/json”标头的响应?
【中文标题】Slim - 如何发送带有“Content-Type:application/json”标头的响应?【英文标题】:Slim - How to send response with "Content-Type: application/json" header? 【发布时间】:2016-04-11 07:17:29 【问题描述】:我有这个简单的 REST api,在 Slim 中完成,
<?php
require '../vendor/autoload.php';
function getDB()
$dsn = 'sqlite:/home/branchito/personal-projects/slim3-REST/database.sqlite3';
$options = array(
PDO::ATTR_PERSISTENT => true,
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION
);
try
$dbh = new PDO($dsn);
foreach ($options as $k => $v)
$dbh->setAttribute($k, $v);
return $dbh;
catch (PDOException $e)
$error = $e->getMessage();
$app = new \Slim\App();
$app->get('/', function($request, $response)
$response->write('Bienvenidos a Slim 3 API');
return $response;
);
$app->get('/getScore/id:\d+', function($request, $response, $args)
try
$db = getDB();
$stmt = $db->prepare("SELECT * FROM students
WHERE student_id = :id
");
$stmt->bindParam(':id', $args['id'], PDO::PARAM_INT);
$stmt->execute();
$student = $stmt->fetch(PDO::FETCH_OBJ);
if($student)
$response->withHeader('Content-Type', 'application/json');
$response->write(json_encode($student));
else throw new PDOException('No records found');
catch (PDOException $e)
$response->withStatus(404);
$err = '"error": "text": "'.$e->getMessage().'"';
$response->write($err);
return $response;
);
$app->run();
但是,我无法让浏览器向我发送 application/json
内容类型,它
总是发送text/html
?我做错了什么?
编辑:
好的,在头撞墙两个小时后,我偶然发现了这个答案:
https://github.com/slimphp/Slim/issues/1535(在页面底部)
这解释了会发生什么,似乎 response
对象是不可变的并且
因此,如果您想在之后退回它,则必须退回或重新分配
同时。
【问题讨论】:
发送响应前是否设置了Content-Type
http响应头?
..你可以在我的代码中看到$response->withHeader('Content-Type', 'application/json');
不应该是return
是echo
?
不。只需return
。 slimframework.com/docs
【参考方案1】:
对于 V3,Slim docs 中最简单的方法是:
$data = array('name' => 'Rob', 'age' => 40);
return $response->withJson($data, 201);
这会自动将 Content-Type 设置为 application/json;charset=utf-8
并允许您设置 HTTP 状态代码(如果省略,则默认为 200)。
【讨论】:
【参考方案2】:你也可以使用:
$response = $response->withHeader('Content-Type', 'application/json');
$response->write(json_encode($student));
return $response;
因为withHeader
返回新的响应对象。这样一来,您之间就有不止一个编写和代码。
【讨论】:
【参考方案3】:对于 V3,withJson()
可用。
所以你可以这样做:
return $response->withStatus(200)
->withJson(array($request->getAttribute("route")
->getArgument("someParameter")));
注意:请务必返回$response
,因为如果您忘记了,回复仍会出现,但不会是application/json
。
【讨论】:
为什么链在单独的行上不起作用? @JomarSevillejo ,我需要查看您的代码以提供提示,但如果它们位于不同的行上,您仍然需要在这些行之后返回对象。 @jomar-sevillejo 这是因为 Response 对象是不可变的。每次你想“修改”它的一个属性时,实际上你所做的就是用这个属性的新值创建一个克隆。因此,链接有效,这是您必须返回给 Slim 的最后一个。 添加:->withJson()
起作用的原因是它不仅设置了正文,还自动添加了标题Content-Type: application/json;charset=utf-8
。正如其他人所指出的, Response 对象是不可变的,因此这将返回一个修改后的副本,然后必须由路由函数返回。【参考方案4】:
所以,不要这样:
if($student)
$response->withHeader('Content-Type', 'application/json');
$response->write(json_encode($student));
return $response;
else throw new PDOException('No records found');
这样做:
if($student)
return $response->withStatus(200)
->withHeader('Content-Type', 'application/json')
->write(json_encode($student));
else throw new PDOException('No records found');
一切都很好。
【讨论】:
以上是关于content-type application/json 请求 服务端怎么获取请求数据的主要内容,如果未能解决你的问题,请参考以下文章
接收 Content-type: application/json 的数据
header('Content-type: application/octet-stream') 导致 0 字节文件
使用 node.js 发送 Content-Type: application/json post
laravel 验证 Content-Type: application/json 请求