如何在 Laravel 中使用 HTTP 请求的删除方法通过外部 Api 库删除项目

Posted

技术标签:

【中文标题】如何在 Laravel 中使用 HTTP 请求的删除方法通过外部 Api 库删除项目【英文标题】:How to use HTTP request's delete method in Laravel to delete item via external Api library 【发布时间】:2021-11-30 05:44:17 【问题描述】:

基本上我使用 Zotero 的 API 从我的 (zotero) 库中获取项目并将它们保存在我的数据库中。

当我点击提交按钮时,数据被保存,但我想同时使用 http 请求的删除方法从在线 zotero 的库中删除它。

以下是 API 文档关于删除的说明:

URI:/keys/<key> 给定 API 密钥的用户 ID 和权限。 使用 DELETE HTTP 方法删除密钥。这通常只能由最初使用 OAuth 创建密钥的客户端完成。

数据的Json结构如下:

structure

这是我的控制器:

public function index(Request $req)

$response = Http::withToken('MyApiKey')->get('https://api.zotero.org/users/myUserID/items?limit=100
    ');
    $response->json();
    $datas= json_decode($response);
return view('partials.ajout_automatique',compact('datas'));

我的看法:

@foreach ($datas as $data)

-- dd(property_exists($data->data,'title')) --

@if (property_exists($data->data,'title'))
    

<form action="/reference/autoCreate" method="post">
    @csrf
    <div>
       

        -- Title --

        @if (property_exists($data->data,'title'))
        <p>Titre: $data->data->title</p>
        <input type="hidden" name="title" value="$data->data->title" >
        @else
        <p>Titre not found</p>
        <input type="hidden" name="title" value="title unfound" >
        @endif

-- etc... --

<button type="submit" name='Ajouter' value="Ajouter"
        class="btn btn-success pl-5 pr-5">Ajouter</button>
</form>

@endif
@endforeach

我的功能商店:

public function store(Request $request)

$response = Http::withToken('ItxwU6wG7bnNDY3E9bVfq3Da')->get('https://api.zotero.org/users/8548265/items?limit=100
    ');
    $response->json();
    $collections= json_decode($response);

        $reference_auto = new Reference;
        $reference_auto->user_id = Auth::user()->id;
        $reference_auto->title = $request->title;
        $reference_auto->authors = $request->authors;
        $reference_auto->year = $request->year;
        $reference_auto->edition = $request->edition;
        $reference_auto->url = $request->url;
        
            $message = "Nouvelle référence ajoutée avec succès."; 
            
          
            $reference_auto->save();
            Alert::success('Ok !', $message);

        
    return redirect()->back();

我不知道应该如何以及在哪里使用Http::delete('http://example.com'); 实现我需要做的事情。 例如删除第一项我在redirect()->back()之前在store函数中尝试这个

   //delete from api lib
    $key=$collections[0]->key;
    Http::withToken('MyApiKey')->delete('https://api.zotero.org/users/MyUserID/items/keys/'.$key);

但它不起作用

【问题讨论】:

在哪里使用该调用取决于您的逻辑。通常,您可以在任何地方调用它。但是“它不起作用”是什么意思?请求是否未正确构建?没有正确发送?它是否返回任何错误? 看看我想做什么,我想我必须在我的商店功能中使用它。当我说它不起作用时,我的意思是它没有返回错误,但没有处理删除 【参考方案1】:

您使用的网址不正确。对于单个项目的删除,您应该发送 DELETE 请求到

'https://api.zotero.org/users/MyUserID/items/' . $key

您还需要在请求中包含 If-Unmodified-Since-Version 标头。请看https://www.zotero.org/support/dev/web_api/v3/write_requests

此外,检查 API 返回的 HTTP 代码以检测问题总是值得的,例如400 Bad Request 表示您发送的请求不正确,另一方面,428 Precondition Required 表示请求已被理解,但(在此特定情况下)未提供必需的 If-Unmodified-Since-Version 标头。

【讨论】:

以上是关于如何在 Laravel 中使用 HTTP 请求的删除方法通过外部 Api 库删除项目的主要内容,如果未能解决你的问题,请参考以下文章

如何在 laravel 中使用不记名令牌从 api 请求中获取响应?

如何清理 laravel 请求输入?

使用 Laravel 在 Azure 中来自单个请求的多个重复 HTTP 请求/查询

如何使用请求验证 Laravel 中的数组?

在 laravel 中使用错误的 http 请求类型(例如 get 而不是 post)时返回 404

如何在 laravel 验证中排除规则